package com.picture.wallpaper.core.utils;

import org.springframework.stereotype.Component;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

@Component
public class AES {
    private static final String AES_ALGORITHM = "AES";
    // AES加密模式为CBC，填充方式为PKCS5Padding
    private static final String AES_TRANSFORMATION = "AES/ECB/PKCS5Padding";
    // AES密钥为16位
    private static final String AES_KEY = "SKY0000000000001";
    // AES初始化向量为16位
//    private static final String AES_IV = "abcdefghijklmnop";

    /**
     * AES加密
     *
     * @param data 待加密的数据
     * @return 加密后的数据，使用Base64编码
     */
    public  String encrypt(String data)  {
        try {
            // 将AES密钥转换为SecretKeySpec对象
            SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);
            // 将AES初始化向量转换为IvParameterSpec对象
//            IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());
            // 根据加密算法获取加密器
            Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
            // 初始化加密器，设置加密模式、密钥和初始化向量
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
            // 加密数据
            byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
            // 对加密后的数据使用Base64编码
            return Base64.getEncoder().encodeToString(encryptedData);
        }catch (Exception e){
            System.out.println(e);
            return null;
        }
    }

    /**
     * AES解密
     *
     * @param encryptedData 加密后的数据，使用Base64编码
     * @return 解密后的数据
     */
    public  String decrypt(String encryptedData)  {
        try {
            // 将AES密钥转换为SecretKeySpec对象
            SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);
            // 将AES初始化向量转换为IvParameterSpec对象
//            IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());
            // 根据加密算法获取解密器
            Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);
            // 初始化解密器，设置解密模式、密钥和初始化向量
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
            // 对加密后的数据使用Base64解码
            byte[] decodedData = Base64.getDecoder().decode(encryptedData);
            // 解密数据
            byte[] decryptedData = cipher.doFinal(decodedData);
            // 返回解密后的数据  , StandardCharsets.UTF_8
            return new String(decryptedData);
        }catch (Exception e){
            System.out.println(e);
            return null;
        }
    }
}
